package com.jdk.demo.reference;

import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;

// -Xmx16m
public class BigObjDemo {

	private static ReferenceQueue<VeryBig> rq = new ReferenceQueue<VeryBig>();

	public static void checkQueue() {
		// 需要通过Reference访问这些对象，但是对象还是被回收了
		Reference<? extends VeryBig> inq = rq.poll();
		if (inq != null) {
			System.out.println("In queue: " + inq.get());
		}else{
			System.out.println("queue empty");
		}
	}

	public static void main(String[] args) throws InterruptedException {
		// SoftReference的语义就是当内存不够用的时候，GC会回收SoftReference所引用的对象。所以，在memory
		// sensitive的程序中将某些大型数据设置成SoftReference再合适不过了。
		// 大约是5m
		byte[] placeholder = new byte[5 * 1024 * 1024];

		SoftReference softRef = new SoftReference(placeholder, rq);
		// 如果不将obj设置成null，那么new出来的Object就会有一个"strong reference"，如果这样，softRef就不能发挥作用了。
		placeholder = null;

		// 触发回收，会把placeholder回收掉
		byte[] placeholder2 = new byte[10 * 1024 * 1024];

		Object obj2 = softRef.get();
		if (obj2 == null) {
			System.out.println("空");
		}
		checkQueue();
		Thread.sleep(5000000);
	}

}

class VeryBig {
	private static final int SIZE = 10000;
	private long[] la = new long[SIZE];
	private String ident;

	public VeryBig(String id) {
		ident = id;
	}

	public String toString() {
		return ident;
	}

	protected void finalize() {
		System.out.println("Finalizing " + ident);
	}
}